The R markdown is available from the pulldown menu for Code at the upper-right, choose “Download Rmd”, or download the Rmd from GitHub.
Probably the most common use of expression data in Cytoscape is to set the visual attributes of the nodes in a network according to expression data. This creates a powerful visualization, portraying functional relation and experimental response at the same time. Here, we will walk through the steps for doing this.
Installation
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
if(!"RCy3" %in% installed.packages())
BiocManager::install("RCy3")
install.packages("httr")
Getting started
First, launch Cytoscape and keep it running whenever using RCy3. Confirm that you have everything installed and running:
library(RCy3)
cytoscapePing()
cytoscapeVersionInfo()
Loading Network
- The demo session is available here and can be opened using:
library(httr)
cys_url = "http://nrnb.org/data/galFilteredSimpleData.cys"
GET(cys_url, write_disk(tf <- tempfile(fileext = ".cys")))
openSession(tf)
- When the network first opens, the entire network is not visible because of the default zoom factor used. To see the whole network, we can use the
fitContent function:
Label the Nodes
- Zoom in on the network so that node labels are visible.
- Check available column names.
getTableColumnNames('node')
- We are going to use the COMMON name attribute to give the nodes useful names:
setNodeLabelMapping('COMMON')
- Verify that the node labels on the network have changed to their common names.
Color the nodes
- As we saw from the “getTableColumnNames” command, there is a column named gal80Rexp, which contains expression data. Let’s check the expression value range of the data in this column:
gal80rexp.score.table <- getTableColumns('node', "gal80Rexp")
gal80rexp.min <- min(gal80rexp.score.table, na.rm = T)
gal80rexp.max <- max(gal80rexp.score.table, na.rm = T)
print(gal80rexp.min)
print(gal80rexp.max)
- The following produces a default gradient ranging from blue to red for gal80Rexp expression values. Notice that the nodes in the network change color.
setNodeColorMapping("gal80Rexp", c(-gal80rexp.max, 0, gal80rexp.max), c('#0000FF', '#FFFFFF', '#FF0000'))
- The network should now look like this:

Set the Default Node Color
Note that the default node color of pale blue is close to the color range in the created palette. A useful trick is to choose a color outside this spectrum to distinguish nodes with no defined expression value and those with slight repression.
- Here we choose a dark gray color for default node color:
setNodeColorDefault('#A9A9A9')
- Zoom out on the network view to verify that a few nodes have been colored gray:
Set the Node Border
We imported both expression measurement values and corresponding significance values. We can use the significance values to change the border of nodes to highlight measurements we have confidence in.
Let’s create a thicker node border for nodes with gal80Rsig value less than 0.05. First, we need to get the min and max of values for gal80Rsig
gal80rsig.score.table <- getTableColumns('node', "gal80Rsig")
gal80rsig.min <- min(gal80rsig.score.table, na.rm = T)
gal80rsig.max <- max(gal80rsig.score.table, na.rm = T)
print(gal80rsig.min)
print(gal80rsig.max)
setNodeBorderWidthMapping('gal80Rsig', c(gal80rsig.min, "0.0499999", "0.05", gal80rsig.max), c('10',"10",'0', '0'))
The node border now indicates significance, but since the default node border color is a pale grey, it is not very visible. We can change the default border color to a darker grey:
setNodeBorderColorDefault('#666666')
Fun with Charts
In addition to coloring the nodes, Cytoscape also provides the ability to draw charts and graphs on each node. For example, suppose we wanted to display a bar chart showing all of the expression values on each of our nodes?
- To reset things a little, remove the mapping for Fill Color. First, let’s find out the property name for Fill Color:
deleteStyleMapping("default", "NODE_FILL_COLOR")
- Now change the default value to a lighter shade of grey so we can see our chart:
setNodeColorDefault('#D3D3D3')
- The following indicates that we’re going to use the data from these three columns expression data (gal1RGexp, gal4RGexp, gal80Rexp) to create bar chart.
setNodeCustomBarChart(c("gal1RGexp", "gal4RGexp", "gal80Rexp"), "HEAT_STRIPS")
The network now shows heat strips for the three expression values, with colors chosen from a default Brewer palette.

LS0tDQp0aXRsZTogIlZpc3VhbGl6aW5nIEV4cHJlc3Npb24gRGF0YSINCmF1dGhvcjogIktvem8gTmlzaGlkYSwgS3Jpc3RpbmEgSGFuc3BlcnMsIEFsZXhhbmRlciBQaWNvIg0KZGF0ZTogJ2ByIFN5cy5EYXRlKClgJw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiANCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogbm9uZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBldmFsPUZBTFNFDQopDQpgYGANCg0KKlRoZSBSIG1hcmtkb3duIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwdWxsZG93biBtZW51IGZvciogQ29kZSAqYXQgdGhlIHVwcGVyLXJpZ2h0LCBjaG9vc2UgIkRvd25sb2FkIFJtZCIsIG9yIFtkb3dubG9hZCB0aGUgUm1kIGZyb20gR2l0SHViXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS1hdXRvbWF0aW9uL21hc3Rlci9mb3Itc2NyaXB0ZXJzL1Ivbm90ZWJvb2tzL21hcHBpbmctZGF0YS5SbWQpLioNCg0KPGhyIC8+DQoNClByb2JhYmx5IHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZXhwcmVzc2lvbiBkYXRhIGluIEN5dG9zY2FwZSBpcyB0byBzZXQgdGhlIHZpc3VhbCBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlcyBpbiBhIG5ldHdvcmsgYWNjb3JkaW5nIHRvIGV4cHJlc3Npb24gZGF0YS4gVGhpcyBjcmVhdGVzIGEgcG93ZXJmdWwgdmlzdWFsaXphdGlvbiwgcG9ydHJheWluZyBmdW5jdGlvbmFsIHJlbGF0aW9uIGFuZCBleHBlcmltZW50YWwgcmVzcG9uc2UgYXQgdGhlIHNhbWUgdGltZS4gSGVyZSwgd2Ugd2lsbCB3YWxrIHRocm91Z2ggdGhlIHN0ZXBzIGZvciBkb2luZyB0aGlzLg0KDQo8Y2VudGVyPg0KIVtdKGRhdGEvaW1nL21hcHBpbmctZGF0YS1maW5hbC5wbmcpDQo8L2NlbnRlcj4NCg0KPGhyIC8+DQoNCiMgSW5zdGFsbGF0aW9uDQpgYGB7ciwgZXZhbCA9IEZBTFNFfQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIsIHF1aWV0bHkgPSBUUlVFKSkNCiAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQ0KaWYoISJSQ3kzIiAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpKQ0KICBCaW9jTWFuYWdlcjo6aW5zdGFsbCgiUkN5MyIpDQoNCmluc3RhbGwucGFja2FnZXMoImh0dHIiKQ0KYGBgDQoNCiMgR2V0dGluZyBzdGFydGVkDQpGaXJzdCwgbGF1bmNoIEN5dG9zY2FwZSBhbmQga2VlcCBpdCBydW5uaW5nIHdoZW5ldmVyIHVzaW5nIFJDeTMuIENvbmZpcm0gdGhhdCB5b3UgaGF2ZSBldmVyeXRoaW5nIGluc3RhbGxlZCBhbmQgcnVubmluZzoNCmBgYHtyfQ0KbGlicmFyeShSQ3kzKQ0KY3l0b3NjYXBlUGluZygpDQpjeXRvc2NhcGVWZXJzaW9uSW5mbygpDQpgYGANCg0KIyBMb2FkaW5nIE5ldHdvcmsNCg0KLSBUaGUgZGVtbyBzZXNzaW9uIGlzIGF2YWlsYWJsZSBbaGVyZV0oaHR0cDovL25ybmIub3JnL2RhdGEvZ2FsRmlsdGVyZWRTaW1wbGVEYXRhLmN5cykgYW5kIGNhbiBiZSBvcGVuZWQgdXNpbmc6DQoNCmBgYHtyfQ0KbGlicmFyeShodHRyKQ0KY3lzX3VybCA9ICJodHRwOi8vbnJuYi5vcmcvZGF0YS9nYWxGaWx0ZXJlZFNpbXBsZURhdGEuY3lzIg0KR0VUKGN5c191cmwsIHdyaXRlX2Rpc2sodGYgPC0gdGVtcGZpbGUoZmlsZWV4dCA9ICIuY3lzIikpKQ0Kb3BlblNlc3Npb24odGYpDQpgYGANCg0KLSBXaGVuIHRoZSBuZXR3b3JrIGZpcnN0IG9wZW5zLCB0aGUgZW50aXJlIG5ldHdvcmsgaXMgbm90IHZpc2libGUgYmVjYXVzZSBvZiB0aGUgZGVmYXVsdCB6b29tIGZhY3RvciB1c2VkLiBUbyBzZWUgdGhlIHdob2xlIG5ldHdvcmssIHdlIGNhbiB1c2UgdGhlIGBmaXRDb250ZW50IGAgZnVuY3Rpb246DQoNCmBgYHtyfQ0KZml0Q29udGVudCgpDQpgYGANCg0KIyBMYWJlbCB0aGUgTm9kZXMNCg0KLSBab29tIGluIG9uIHRoZSBuZXR3b3JrIHNvIHRoYXQgbm9kZSBsYWJlbHMgYXJlIHZpc2libGUuDQotIENoZWNrIGF2YWlsYWJsZSBjb2x1bW4gbmFtZXMuDQoNCmBgYHtyfQ0KZ2V0VGFibGVDb2x1bW5OYW1lcygnbm9kZScpDQpgYGANCg0KLSBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBDT01NT04gbmFtZSBhdHRyaWJ1dGUgdG8gZ2l2ZSB0aGUgbm9kZXMgdXNlZnVsIG5hbWVzOg0KDQpgYGB7cn0NCnNldE5vZGVMYWJlbE1hcHBpbmcoJ0NPTU1PTicpDQpgYGANCg0KLSBWZXJpZnkgdGhhdCB0aGUgbm9kZSBsYWJlbHMgb24gdGhlIG5ldHdvcmsgaGF2ZSBjaGFuZ2VkIHRvIHRoZWlyIGNvbW1vbiBuYW1lcy4NCg0KIyBDb2xvciB0aGUgbm9kZXMNCg0KLSBBcyB3ZSBzYXcgZnJvbSB0aGUgImdldFRhYmxlQ29sdW1uTmFtZXMiIGNvbW1hbmQsIHRoZXJlIGlzIGEgY29sdW1uIG5hbWVkICoqZ2FsODBSZXhwKiosIHdoaWNoIGNvbnRhaW5zIGV4cHJlc3Npb24gZGF0YS4gTGV0J3MgY2hlY2sgdGhlIGV4cHJlc3Npb24gdmFsdWUgcmFuZ2Ugb2YgdGhlIGRhdGEgaW4gdGhpcyBjb2x1bW46DQoNCmBgYHtyfQ0KZ2FsODByZXhwLnNjb3JlLnRhYmxlIDwtIGdldFRhYmxlQ29sdW1ucygnbm9kZScsICJnYWw4MFJleHAiKQ0KZ2FsODByZXhwLm1pbiA8LSBtaW4oZ2FsODByZXhwLnNjb3JlLnRhYmxlLCBuYS5ybSA9IFQpDQpnYWw4MHJleHAubWF4IDwtIG1heChnYWw4MHJleHAuc2NvcmUudGFibGUsIG5hLnJtID0gVCkNCnByaW50KGdhbDgwcmV4cC5taW4pDQpwcmludChnYWw4MHJleHAubWF4KQ0KYGBgDQoNCi0gVGhlIGZvbGxvd2luZyBwcm9kdWNlcyBhIGRlZmF1bHQgZ3JhZGllbnQgcmFuZ2luZyBmcm9tIGJsdWUgdG8gcmVkIGZvciAqKmdhbDgwUmV4cCoqIGV4cHJlc3Npb24gdmFsdWVzLiBOb3RpY2UgdGhhdCB0aGUgbm9kZXMgaW4gdGhlIG5ldHdvcmsgY2hhbmdlIGNvbG9yLg0KDQpgYGB7cn0NCnNldE5vZGVDb2xvck1hcHBpbmcoImdhbDgwUmV4cCIsIGMoLWdhbDgwcmV4cC5tYXgsIDAsIGdhbDgwcmV4cC5tYXgpLCBjKCcjMDAwMEZGJywgJyNGRkZGRkYnLCAnI0ZGMDAwMCcpKQ0KYGBgDQoNCi0gVGhlIG5ldHdvcmsgc2hvdWxkIG5vdyBsb29rIGxpa2UgdGhpczoNCg0KIVtdKGRhdGEvaW1nL05ldHdvcmtCcmV3ZXIucG5nKQ0KDQojIFNldCB0aGUgRGVmYXVsdCBOb2RlIENvbG9yDQoNCk5vdGUgdGhhdCB0aGUgZGVmYXVsdCBub2RlIGNvbG9yIG9mIHBhbGUgYmx1ZSBpcyBjbG9zZSB0byB0aGUgY29sb3IgcmFuZ2UgaW4gdGhlIGNyZWF0ZWQgcGFsZXR0ZS4NCkEgdXNlZnVsIHRyaWNrIGlzIHRvIGNob29zZSBhIGNvbG9yIG91dHNpZGUgdGhpcyBzcGVjdHJ1bSB0byBkaXN0aW5ndWlzaCBub2RlcyB3aXRoIG5vIGRlZmluZWQgZXhwcmVzc2lvbiB2YWx1ZSBhbmQgdGhvc2Ugd2l0aCBzbGlnaHQgcmVwcmVzc2lvbi4NCg0KLSBIZXJlIHdlIGNob29zZSBhIGRhcmsgZ3JheSBjb2xvciBmb3IgZGVmYXVsdCBub2RlIGNvbG9yOg0KDQpgYGB7cn0NCnNldE5vZGVDb2xvckRlZmF1bHQoJyNBOUE5QTknKQ0KYGBgDQoNCi0gWm9vbSBvdXQgb24gdGhlIG5ldHdvcmsgdmlldyB0byB2ZXJpZnkgdGhhdCBhIGZldyBub2RlcyBoYXZlIGJlZW4gY29sb3JlZCBncmF5Og0KDQpgYGB7cn0NCmZpdENvbnRlbnQoKQ0KYGBgDQoNCiMgU2V0IHRoZSBOb2RlIEJvcmRlcg0KDQpXZSBpbXBvcnRlZCBib3RoIGV4cHJlc3Npb24gbWVhc3VyZW1lbnQgdmFsdWVzIGFuZCBjb3JyZXNwb25kaW5nIHNpZ25pZmljYW5jZSB2YWx1ZXMuIA0KV2UgY2FuIHVzZSB0aGUgc2lnbmlmaWNhbmNlIHZhbHVlcyB0byBjaGFuZ2UgdGhlIGJvcmRlciBvZiBub2RlcyB0byBoaWdobGlnaHQgbWVhc3VyZW1lbnRzIHdlIGhhdmUgY29uZmlkZW5jZSBpbi4NCg0KTGV0J3MgY3JlYXRlIGEgdGhpY2tlciBub2RlIGJvcmRlciBmb3Igbm9kZXMgd2l0aCAqKmdhbDgwUnNpZyoqIHZhbHVlIGxlc3MgdGhhbiAwLjA1Lg0KRmlyc3QsIHdlIG5lZWQgdG8gZ2V0IHRoZSBtaW4gYW5kIG1heCBvZiB2YWx1ZXMgZm9yICoqZ2FsODBSc2lnKioNCg0KYGBge3J9DQpnYWw4MHJzaWcuc2NvcmUudGFibGUgPC0gZ2V0VGFibGVDb2x1bW5zKCdub2RlJywgImdhbDgwUnNpZyIpDQpnYWw4MHJzaWcubWluIDwtIG1pbihnYWw4MHJzaWcuc2NvcmUudGFibGUsIG5hLnJtID0gVCkNCmdhbDgwcnNpZy5tYXggPC0gbWF4KGdhbDgwcnNpZy5zY29yZS50YWJsZSwgbmEucm0gPSBUKQ0KcHJpbnQoZ2FsODByc2lnLm1pbikNCnByaW50KGdhbDgwcnNpZy5tYXgpDQpgYGANCg0KYGBge3J9DQpzZXROb2RlQm9yZGVyV2lkdGhNYXBwaW5nKCdnYWw4MFJzaWcnLCBjKGdhbDgwcnNpZy5taW4sICIwLjA0OTk5OTkiLCAiMC4wNSIsIGdhbDgwcnNpZy5tYXgpLCBjKCcxMCcsIjEwIiwnMCcsICcwJykpDQpgYGANCg0KVGhlIG5vZGUgYm9yZGVyIG5vdyBpbmRpY2F0ZXMgc2lnbmlmaWNhbmNlLCBidXQgc2luY2UgdGhlIGRlZmF1bHQgbm9kZSBib3JkZXIgY29sb3IgaXMgYSBwYWxlIGdyZXksIGl0IGlzIG5vdCB2ZXJ5IHZpc2libGUuIFdlIGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgYm9yZGVyIGNvbG9yIHRvIGEgZGFya2VyIGdyZXk6DQoNCmBgYHtyfQ0Kc2V0Tm9kZUJvcmRlckNvbG9yRGVmYXVsdCgnIzY2NjY2NicpDQpgYGANCg0KIyBGdW4gd2l0aCBDaGFydHMNCg0KSW4gYWRkaXRpb24gdG8gY29sb3JpbmcgdGhlIG5vZGVzLCBDeXRvc2NhcGUgYWxzbyBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkcmF3IGNoYXJ0cyBhbmQgZ3JhcGhzIG9uIGVhY2ggbm9kZS4NCkZvciBleGFtcGxlLCBzdXBwb3NlIHdlIHdhbnRlZCB0byBkaXNwbGF5IGEgYmFyIGNoYXJ0IHNob3dpbmcgYWxsIG9mIHRoZSBleHByZXNzaW9uIHZhbHVlcyBvbiBlYWNoIG9mIG91ciBub2Rlcz8NCg0KLSBUbyByZXNldCB0aGluZ3MgYSBsaXR0bGUsIHJlbW92ZSB0aGUgbWFwcGluZyBmb3IgRmlsbCBDb2xvci4gRmlyc3QsIGxldCdzIGZpbmQgb3V0IHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBGaWxsIENvbG9yOg0KDQpgYGB7cn0NCmdldFZpc3VhbFByb3BlcnR5TmFtZXMoKQ0KYGBgDQoNCmBgYHtyfQ0KZGVsZXRlU3R5bGVNYXBwaW5nKCJkZWZhdWx0IiwgIk5PREVfRklMTF9DT0xPUiIpDQpgYGANCg0KLSBOb3cgY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGEgbGlnaHRlciBzaGFkZSBvZiBncmV5IHNvIHdlIGNhbiBzZWUgb3VyIGNoYXJ0Og0KDQpgYGB7cn0NCnNldE5vZGVDb2xvckRlZmF1bHQoJyNEM0QzRDMnKQ0KYGBgDQoNCi0gVGhlIGZvbGxvd2luZyBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSBnb2luZyB0byB1c2UgdGhlIGRhdGEgZnJvbSB0aGVzZSB0aHJlZSBjb2x1bW5zIGV4cHJlc3Npb24gZGF0YSAoZ2FsMVJHZXhwLCBnYWw0UkdleHAsIGdhbDgwUmV4cCkgdG8gY3JlYXRlIGJhciBjaGFydC4NCg0KYGBge3J9DQpzZXROb2RlQ3VzdG9tQmFyQ2hhcnQoYygiZ2FsMVJHZXhwIiwgImdhbDRSR2V4cCIsICJnYWw4MFJleHAiKSwgIkhFQVRfU1RSSVBTIikNCmBgYA0KDQpUaGUgbmV0d29yayBub3cgc2hvd3MgaGVhdCBzdHJpcHMgZm9yIHRoZSB0aHJlZSBleHByZXNzaW9uIHZhbHVlcywgd2l0aCBjb2xvcnMgY2hvc2VuIGZyb20gYSBkZWZhdWx0IEJyZXdlciBwYWxldHRlLiANCg0KIVtdKGRhdGEvaW1nL21hcHBpbmctZGF0YS1maW5hbC5wbmcpDQo=